<?php
require_once 'BancoDeDados.php';
class Endereco {

    private $cod_endereco;
    private $logradouro;
    private $numero;
    private $cidade;
    private $estado;
    private $cep;
    private $bairro;
    private $complemento;
    private $vinculado;

    public function getCod_endereco() {
        return $this->cod_endereco;
    }

    public function setCod_endereco($cod_endereco) {
        $this->cod_endereco = $cod_endereco;
    }

    public function getLogradouro() {
        return $this->logradouro;
    }

    public function setLogradouro($logradouro) {
        $this->logradouro = $logradouro;
    }

    public function getNumero() {
        return $this->numero;
    }

    public function setNumero($numero) {
        $this->numero = $numero;
    }

    public function getCidade() {
        return $this->cidade;
    }

    public function setCidade($cidade) {
        $this->cidade = $cidade;
    }

    public function getEstado() {
        return $this->estado;
    }

    public function setEstado($estado) {
        $this->estado = $estado;
    }

    public function getCep() {
        return $this->cep;
    }

    public function setCep($cep) {
        $this->cep = $cep;
    }

    public function getBairro() {
        return $this->bairro;
    }

    public function setBairro($bairro) {
        $this->bairro = $bairro;
    }

    public function getComplemento() {
        return $this->complemento;
    }

    public function setComplemento($complemento) {
        $this->complemento = $complemento;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    /**
     * @method void cadastrar() para cadastro do recurso
     * Para que este possa ser utilizado ao menos a descrição não pode ser vazia
     * @return void
     */
    public function cadastrar() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into endereco (logradouro, numero, cidade, estado, cep, bairro, complemento) values(?,?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->logradouro, $this->numero, $this->cidade, $this->estado, $this->cep, $this->bairro, $this->complemento));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $result = $banco->getLink()->query('select cod_endereco from endereco where logradouro = ? and numero = ? and cidade = ? and estado = ? and cep = ? and bairro = ? and complemento = ?', array($this->logradouro, $this->numero, $this->cidade, $this->estado, $this->cep, $this->bairro, $this->complemento));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $result->fetchInto($row);
        $this->cod_endereco = &$row['cod_endereco'];
        $link->commit();
    }

    /**
     * @method void alterar() para alteração do recurso
     * @return void
     */
    public function alterar() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update endereco set logradouro = ?, numero = ?, cidade = ?, estado = ?, cep = ?, bairro = ?, complemento = ? where cod_endereco = ?');
        $result = $link->execute($stmt, array($this->logradouro, $this->numero, $this->cidade, $this->estado, $this->cep, $this->bairro, $this->complemento, $this->cod_endereco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    /**
     * @method void excluir() para exclusão do recurso
     * Para que este possa ser utilizado o cod_aquisicao não pode estar vazio
     * @return void
     */
    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from endereco where cod_endereco = ?');
        $result = $link->execute($stmt, array($this->cod_endereco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    /**
     * @method Endereco consultar($Cod_Endereco) para consulta do recurso
     * @static
     * @param integer $cod_endereco chave primária para consulta
     * @return Endereco retorna o recurso de acordo com a chave primária passada
     */
    public static function &consultar(&$cod_endereco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from endereco where cod_endereco = ?', array($cod_endereco));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Endereço inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Endereço com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $endereco = new Endereco();
        $endereco->setBairro($row['bairro']);
        $endereco->setCep($row['cep']);
        $endereco->setCidade($row['cidade']);
        $endereco->setComplemento($row['complemento']);
        $endereco->setEstado($row['estado']);
        $endereco->setLogradouro($row['logradouro']);
        $endereco->setNumero($row['numero']);
        return $endereco;
    }
}
?>